package gui;

import helpers.Categoria;
import helpers.Comparador;
import interfaces.ProdutoInterface;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.Comparator;
import java.util.Iterator;

import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class AbaConsulta extends JPanel {

	private static final long serialVersionUID = 1L;

	private final int QTD = 10;

	private static int quantidadeResultados, primeiroExibido;

	private JLabel labelTextoCategoria, labelTextoFabricante, labelTextoTitulo;

	private JPanel painelEsquerda, painelDireita, painelCategoria,
			painelFabricante, painelBusca, painelResultados, painelNavega;

	private JButton buttonFiltra, buttonBusca, buttonPrimeira, buttonAnterior,
			buttonProxima, buttonUltima;

	private JTextField textFieldBusca;

	private JComboBox comboOrdenacao;

	private RadioButtonCategoria radioCategoria1, radioCategoriaAll;

	private RadioButtonFabricante radioFabricante1, radioFabricante2,
			radioFabricante3, radioFabricante4, radioFabricanteAll;

	private ButtonGroup radioGroupCategoria, radioGroupFabricante;

	private JScrollPane scrollResultados;

	public AbaConsulta() {

		AbaConsulta.primeiroExibido = 1;

		this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

		labelTextoTitulo = new JLabel("Busca de Produtos");
		labelTextoFabricante = new JLabel("Fabricante:");
		labelTextoCategoria = new JLabel("Categoria:");

		buttonPrimeira = new JButton("<<");
		buttonPrimeira.addActionListener(new OuvinteBotoes());

		buttonAnterior = new JButton("<");
		buttonAnterior.addActionListener(new OuvinteBotoes());

		buttonProxima = new JButton(">");
		buttonProxima.addActionListener(new OuvinteBotoes());

		buttonUltima = new JButton(">>");
		buttonUltima.addActionListener(new OuvinteBotoes());

		buttonBusca = new JButton("Buscar");
		buttonBusca.addActionListener(new OuvinteBotoes());

		buttonFiltra = new JButton("Filtrar");
		buttonFiltra.addActionListener(new OuvinteBotoes());

		textFieldBusca = new JTextField(15);

		// String criterios[] = {"Nome", "Preco", "Estoque"};
		Comparator criterios[] = { new Comparador.ComparadorNome(),
				new Comparador.ComparadorPreco(),
				new Comparador.ComparadorEstoque() };
		comboOrdenacao = new JComboBox(criterios);

		radioFabricante1 = new RadioButtonFabricante("HP", "HP");
		radioFabricante2 = new RadioButtonFabricante("Apple", "Apple");
		radioFabricante3 = new RadioButtonFabricante("Dell", "Dell");
		radioFabricante4 = new RadioButtonFabricante("Asus", "Asus");
		radioFabricanteAll = new RadioButtonFabricante("Todos",
				RadioButtonFabricante.TODOS);
		radioFabricanteAll.setSelected(true);

		radioCategoria1 = new RadioButtonCategoria(Categoria.NOTEBOOK.name(),
				Categoria.NOTEBOOK);
		radioCategoriaAll = new RadioButtonCategoria("Todos", Categoria.ALL);
		radioCategoriaAll.setSelected(true);

		radioGroupFabricante = new ButtonGroup();
		radioGroupFabricante.add(radioFabricanteAll);
		radioGroupFabricante.add(radioFabricante1);
		radioGroupFabricante.add(radioFabricante2);
		radioGroupFabricante.add(radioFabricante3);
		radioGroupFabricante.add(radioFabricante4);

		radioGroupCategoria = new ButtonGroup();
		radioGroupCategoria.add(radioCategoriaAll);
		radioGroupCategoria.add(radioCategoria1);

		painelEsquerda = new JPanel();
		painelEsquerda
				.setLayout(new BoxLayout(painelEsquerda, BoxLayout.Y_AXIS));
		painelCategoria = new JPanel();
		painelCategoria.setLayout(new BoxLayout(painelCategoria,
				BoxLayout.Y_AXIS));
		painelFabricante = new JPanel();
		painelFabricante.setLayout(new BoxLayout(painelFabricante,
				BoxLayout.Y_AXIS));

		painelEsquerda.add(painelCategoria);
		painelEsquerda.add(painelFabricante);
		painelEsquerda.add(buttonFiltra);

		painelCategoria.add(labelTextoCategoria);
		painelCategoria.add(radioCategoriaAll);
		painelCategoria.add(radioCategoria1);

		painelFabricante.add(labelTextoFabricante);
		painelFabricante.add(radioFabricanteAll);
		painelFabricante.add(radioFabricante1);
		painelFabricante.add(radioFabricante2);
		painelFabricante.add(radioFabricante3);
		painelFabricante.add(radioFabricante4);

		painelDireita = new JPanel();
		painelDireita.setLayout(new BoxLayout(painelDireita, BoxLayout.Y_AXIS));
		painelBusca = new JPanel();
		painelResultados = new JPanel();
		painelResultados.setLayout(new BoxLayout(painelResultados,
				BoxLayout.Y_AXIS));
		painelResultados.setVisible(true);
		painelNavega = new JPanel();

		painelDireita.add(painelBusca);
		painelBusca.add(labelTextoTitulo);
		painelBusca.add(textFieldBusca);
		painelBusca.add(comboOrdenacao);
		painelBusca.add(buttonBusca);

		this.atualizaResultados();

		scrollResultados = new JScrollPane(painelResultados);
		scrollResultados
				.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

		painelDireita.add(scrollResultados);

		painelDireita.add(painelNavega);
		painelDireita.setLayout(new BoxLayout(painelDireita, BoxLayout.Y_AXIS));
		painelNavega.add(buttonPrimeira);
		painelNavega.add(buttonAnterior);
		painelNavega.add(buttonProxima);
		painelNavega.add(buttonUltima);

		this.add(painelEsquerda);
		this.add(painelDireita);

	}

	class OuvinteInformacoes implements ActionListener {
		private ProdutoInterface produto;

		public OuvinteInformacoes(ProdutoInterface p) {
			this.produto = p;
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			Principal.janela.infoProduto.setProduto(produto);
			Principal.tabManager.setEnabledAt("Informacoes", true);
			Principal.tabManager.setSelectedTab("Informacoes");
		}

	}

	class OuvinteBotoes implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {

			if (e.getSource() == buttonBusca) {// chamada veio de busca
				busca();

			} else if (e.getSource() == buttonFiltra) {// chamada veio de
				filtra();

			} else if (e.getSource() == buttonPrimeira) {// exibir do 0 ao 10 do
				AbaConsulta.primeiroExibido = 1;

			} else if (e.getSource() == buttonAnterior) { // diminuir 10 do
				AbaConsulta.primeiroExibido -= 10;

			} else if (e.getSource() == buttonProxima) { // aumentar 10 no
				AbaConsulta.primeiroExibido += 10;

			} else { // chamada veio de botaoultima
				// pegar o total - mod10 como primeiro e total como ultimo
				AbaConsulta.primeiroExibido = AbaConsulta.quantidadeResultados % 10;
			}

			// atualiza o treeSet do principal
			atualizaResultados();

		}

	}

	private void atualizaResultados() {
		painelResultados.removeAll();

		Iterator<ProdutoInterface> it = Principal.resultadosBusca.iterator();

		while (it.hasNext()) {
			ProdutoInterface p = it.next();
			JPanel painel = new JPanel();
			JLabel labelNome = new JLabel(p.getNome());
			JLabel labelTextoValor = new JLabel("Preco unitario: R$");
			JLabel labelValor = new JLabel(String.valueOf(p.getValorVenda()));
			JButton buttonInformacoes = new JButton("+ informacoes");

			painel.add(labelNome);
			painel.add(labelTextoValor);
			painel.add(labelValor);
			painel.add(buttonInformacoes);

			buttonInformacoes.addActionListener(new OuvinteInformacoes(p));

			painelResultados.add(painel);
		}

		fazPaginacao();

		validate();

	}

	private void fazPaginacao() {

		if (primeiroExibido == 1) {
			buttonPrimeira.setEnabled(false);
			buttonAnterior.setEnabled(false);
		} else {
			buttonPrimeira.setEnabled(true);
			buttonAnterior.setEnabled(true);
		}

		if (quantidadeResultados > primeiroExibido + QTD - 1) {
			buttonProxima.setEnabled(true);
			buttonUltima.setEnabled(true);
		} else {
			buttonProxima.setEnabled(false);
			buttonUltima.setEnabled(false);
		}

		painelNavega.validate();

	}

	private void busca() {

		// recebe um treeset do servidor
		String nome = textFieldBusca.getText();
		Comparator<ProdutoInterface> ordenacao = (Comparator<ProdutoInterface>) comboOrdenacao
				.getSelectedItem();
		try {
			AbaConsulta.quantidadeResultados = Principal.servidor
					.getQuantidadeByNome(ordenacao, primeiroExibido, QTD, nome);
			Principal.resultadosBusca = Principal.servidor.getProdutosByNome(
					ordenacao, AbaConsulta.primeiroExibido, this.QTD, nome);
			// System.out.println(Principal.resultadosBusca);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

	private void filtra() {
		Categoria categoria = null;

		Component[] components = painelCategoria.getComponents();
		for (int i = 0; i < components.length; i++) {
			if (components[i] instanceof RadioButtonCategoria) {
				RadioButtonCategoria radio = (RadioButtonCategoria) components[i];
				if (radio.isSelected()) {
					categoria = radio.getCategoria();
					break;
				}
			}
		}

		String fabricante = null;

		components = painelFabricante.getComponents();
		for (int i = 0; i < components.length; i++) {
			if (components[i] instanceof RadioButtonFabricante) {
				RadioButtonFabricante radioFrabricante = (RadioButtonFabricante) components[i];
				if (radioFrabricante.isSelected()) {
					fabricante = radioFrabricante.getFabricante();
					break;
				}
			}
		}

		Comparator<ProdutoInterface> comparator = new Comparador.ComparadorNome();
		int primeiro = AbaConsulta.primeiroExibido;
		int quantidade = this.QTD;

		try {
			AbaConsulta.quantidadeResultados = Principal.servidor
					.getQuantidadeByCategoriaFabricante(comparator, primeiro,
							quantidade, categoria, fabricante);
			Principal.resultadosBusca = Principal.servidor
					.getProdutosByCategoriaFabricante(comparator, primeiro,
							quantidade, categoria, fabricante);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}
